
/**
 * 
 * 敏感字段加密
 * 
 * 题目描述

给定一个由多个命令字组成的命令字符串：

字符串长度小于等于127字节，只包含大小写字母，数字，下划线和偶数个双引号；
命令字之间以一个或多个下划线 _ 进行分割；
可以通过两个双引号 "" 来标识包含下划线 _ 的命令字或空命令字（仅包含两个双引号的命令字），双引号不会在命令字内部出现；
请对指定索引的敏感字段进行加密，替换为******（6个*），并删除命令字前后多余的下划线_。

如果无法找到指定索引的命令字，输出字符串ERROR。
 * 
 * 
 */

 /**
  * 
  输入描述
输入为两行，第一行为命令字索引 K（从 0 开始），第二行为命令字符串 S。

输出描述
输出处理后的命令字符串，如果无法找到指定索引的命令字，输出字符串ERROR
  */

/*
 * 用例
 * 输入	1
password__a12345678_timeout_100
输出	password_******_timeout_100
说明	无

输入	2
aaa_password_"a12_45678"_timeout__100_""_
输出	aaa_password_******_timeout_100_""
说明	无
 */

/**
 * 
 * 采用一个 boolean isInner 值来判断当前遍历的字符是否在"内
 * if('"' == charAt) isInner = !isInner
 * if('_' != charAt || isInner) 不截断，作为一个完成的字符串 通过 StringBuilder 拼接
 * else   截断 把截断后的字符串保持到list 中
 * 
 * 判断指定的下标list 中存不存在，不存在输入 ERROR  存在 则把对应下标的字符串改成******* 并通过
 * String.join("_", list) 用_拼接成字符串
 * 
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 
 * 题目解析
 * 
 * 本题只要考虑清楚一个问题就行：

什么样的 '_' 是命令字分隔符？

不在双引号内的 '_' 是命令字的分隔符

因此，我们遍历输入串s的每个字符c时：

若 c == '_'，且 c 不在双引号范围内，则此时 c 是命令字分隔符，可以截断命令字。
其余情况，c 都可以当成命令字的组成字符。
那么如何判断 '_' 是否在双引号范围内呢？

我们可以定义一个哨兵变量 isQuotaOpen，

若 isQuotaOpen == true，则说明当前双引号处于开启状态，后面遇到的字符都是双引号内部的。
若 isQuotaOpen == false，则说明当前双引号处于闭合状态，后面遇到的字符不在双引号内部
在我们遍历输入串 s 的过程中，每当遇到双引号字符，则对 isQuotaOpen 取反即可。


重点在于怎么判断 '_' 是否在 "" 外   如果'_' 在""外，则可以作为拆分标识

 */

public class 敏感字段加密 {

    public static void main(String[] args){

        try{

            //接收输入
            Scanner scanner = new Scanner(System.in);

            //加密下标
            int position = scanner.nextInt();

            //命令字符
            String command = scanner.next();

            //手动添加一个分隔符
            command += "_";

            //增加变量来判断下滑线是否在引号内，遇到引号就对该变量取反
            //false = 不在引号内，true = 在引号内
            boolean isInner = false; //默认不在引号内

            //保存单次判断为整体的字符串
            StringBuilder builder = new StringBuilder();
            List<String> commandList = new ArrayList<String>();

            //遍历字符串
            for(int i=0; i<command.length(); i++){

                //根据字符判断
                char charAtIndex = command.charAt(i);

                if('"' == charAtIndex)  isInner = !isInner;

                if('_' != charAtIndex || isInner){

                    //不做截断，当做一个整体
                    builder.append(charAtIndex);
                } else {
                    //可以被截断
                    if(builder.length() > 0){
                        //当次的整体字符串保存到列表
                        commandList.add(builder.toString());

                        //清空builder
                        builder = new StringBuilder();

                    }
                }


            }

            //判断当前的 list中是否存在输入的下标对应的字符串
            if(position >= commandList.size()){

                //不存在该下标的字符
                System.out.println("ERROR");
            } else {

                //存在，把对应下标的字符改成******
                commandList.set(position, "******");
                //将列表转成 String 并以_拼接

                String result = String.join("_", commandList);

                System.out.println(result);

            }


        }catch(Exception e){
            e.printStackTrace();
            System.out.println("程序异常"+(null==e?"":e.getMessage()));
        }

    }
}
